﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace TestProj
{
    public partial class Form1 : Form
    {
        Random rnd = new Random();

        public Form1()
        {
            InitializeComponent();

            /*  string[] dl = Directory.GetDirectories(this.HomePath, "*", SearchOption.AllDirectories);
                string[] fl = Directory.GetFiles(this.HomePath, "*", SearchOption.AllDirectories);*/
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
                RandomCreateDirs(@"D:\Тест Mirror\Dir1\Каталог\Подкаталог1", 4);
            for (int i = 0; i < 10; i++)
                RandomCreateDirs(@"D:\Тест Mirror\Dir2\Каталог\Подкаталог1", 4);
            /*  for (int i = 0; i < 10; i++)
                  RandomCreateDirs(@"D:\Тест Mirror\Dir1\Каталог\Подкаталог1", 2);*/
        }


        void RandomCreateDirs(string Dir, int maxLevel)
        {
            if (rnd.Next(100) < 50)
            {
                string dPath = Dir + "\\" + GetRandomName(false);
                if (!Directory.Exists(dPath)) Directory.CreateDirectory(dPath);
                if (Dir.Replace(Dir, "").Split('\\').Length >= maxLevel) return;

                for (int i = 0; i < 5; i++)
                {
                    //if (rnd.Next(100) < 35) RandomCreateFiles(d);
                    RandomCreateDirs(dPath, maxLevel - 1);
                }
            }
        }

        void ChangeDirs(string Dir, int maxLevel)
        {
            string[] dl = Directory.GetDirectories(Dir, "*", SearchOption.AllDirectories);

            // создание новых файлов 
            /*if (rnd.Next(100) < 20)
            {
                RandomCreateFiles(Dir);
            }*/

            foreach (string d in dl)
            {
                // удаление каталога
                if (rnd.Next(100) < 20 && Directory.Exists(d))
                {
                    Directory.Delete(d, true);
                }
                // создание каталога
                if (rnd.Next(100) < 30 && Directory.Exists(d) && Dir.Replace(Dir, "").Split('\\').Length >= maxLevel)
                {
                    string dPath = d + "\\" + GetRandomName(false);
                    if (!Directory.Exists(dPath)) Directory.CreateDirectory(dPath);
                }
                // переименование каталога
                if (rnd.Next(100) < 20 && Directory.Exists(d))
                {
                    string dPath = (new FileInfo(d)).Directory + "\\" + GetRandomName(false);
                    if (!Directory.Exists(dPath)) Directory.Move(d, dPath);
                }
                // создание новых файлов 
                if (rnd.Next(100) < 20 && Directory.Exists(d))
                {
                    RandomCreateFiles(d);
                }
            }
        }

        void ChangeFiles(string Dir)
        {
            string[] fl = Directory.GetFiles(Dir, "*", SearchOption.AllDirectories);
            foreach (string f in fl)
            {
                // удаление
                if (rnd.Next(100) < 20 && File.Exists(f))
                {
                    File.Delete(f);
                }
                // cоздание
                if (rnd.Next(100) < 30 && File.Exists(f))
                {
                    CreateFile(Dir);
                }
                // переименование
                if (rnd.Next(100) < 20 && File.Exists(f))
                {
                    string fPath = (new FileInfo(f)).Directory + "\\" + GetRandomName(true);
                    if (!File.Exists(fPath)) File.Move(f, fPath);
                }
                // изменение
                if (rnd.Next(100) < 40 && File.Exists(f))
                {
                    FillFile(f);
                }
            }
        }

        string GetRandomName(bool bFile)
        {
            int len = 3 + rnd.Next(6);
            string name = "";
            for (int i = 0; i < len; i++)
                name += (char)(97 + rnd.Next(26));
            if (bFile)
            {
                name += ".";
                for (int i = 0; i < 3; i++)
                    name += (char)(97 + rnd.Next(26));
            }
            return name;
        }

        void RandomCreateFiles(string Dir)
        {
            for (int i = 0; i < 10; i++)
            {
                if (rnd.Next(100) < 50)
                {
                    CreateFile(Dir);
                }
            }
        }

        void CreateFile(string Dir)
        {
            string fPath = Dir + "\\" + GetRandomName(true);
            if (!File.Exists(fPath)) FillFile(fPath);
        }

        void FillFile(string fPath)
        {
            byte[] buf = new byte[rnd.Next(1000)];
            for (int i = 0; i < buf.Length; i++) buf[i] = (byte)rnd.Next(256);
            File.WriteAllBytes(fPath, buf);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //for (int i = 0; i < 10; i++)
            ChangeFiles(@"D:\Тест Mirror\Dir1\Каталог\Подкаталог1");
            ChangeDirs(@"D:\Тест Mirror\Dir1\Каталог\Подкаталог1", 4);

            //for (int i = 0; i < 10; i++)
            ChangeFiles(@"D:\Тест Mirror\Dir2\Каталог\Подкаталог1");
            ChangeDirs(@"D:\Тест Mirror\Dir2\Каталог\Подкаталог1", 4);

        }

    }
}
